<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:rng="http://relaxng.org/ns/structure/1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" exclude-result-prefixes="rng">
	<xsl:import href="RngToRnc-1_4/RngToRncClassic.xsl"/>
	<xsl:variable name="meta" select="document('../reference-manual/elements-meta.xml')"/>
	<xsl:strip-space elements="*"/>
	<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

	<xsl:template match="/">
		<xsl:processing-instruction name="xml-stylesheet">type="text/css" href="chapter.css"</xsl:processing-instruction>
		<chapter id="elements.xml">
			<title>Elements reference guide</title>
			<xsl:copy-of select="$meta/chapter/simplesect[1]"/>
			<sect1>
				<title>Elements</title>
				<xsl:apply-templates select="//rng:element[@name]" mode="elements">
					<xsl:sort select="@name"/>
				</xsl:apply-templates>
			</sect1>
		</chapter>
	</xsl:template>
	
	<xsl:template match="rng:element[@name=following::rng:element/@name or @name=preceding::rng:element/@name]" mode="elements">
		<xsl:call-template name="element">
			<xsl:with-param name="id" select="concat('ch15-', @name, count(preceding::rng:element[@name=current()/@name])+1)"/>
			<xsl:with-param name="title" select="concat(@name, ' (in the context of a ', ancestor::rng:define/@name, ')')"/>
		</xsl:call-template>
	</xsl:template>

	<xsl:template match="rng:element" mode="elements" name="element">
		<xsl:param name="id" select="concat('ch15-',@name)"/>
		<xsl:param name="title" select="@name"/>
		<refentry id="{$id}">
			<refmeta>
				<refentrytitle>
					<xsl:value-of select="$title"/>
				</refentrytitle>
			</refmeta>
			<refnamediv>
				<indexterm id="IXT-{generate-id()}">
					<primary>
						<xsl:value-of select="$title"/>
					</primary>
				</indexterm>
				<refname>
					<xsl:value-of select="$title"/>
				</refname>
				<xsl:apply-templates select="$meta//refentry[@id=$id]/purpose" mode="meta"/>
			</refnamediv>
			<refsect1>
				<title>Class:</title>
				<para>
					<xsl:value-of select="ancestor::rng:define/@name"/>
				</para>
			</refsect1>
			<refsynopsisdiv>
				<synopsis>
					<xsl:text>&#xa;</xsl:text>
					<xsl:apply-templates select="."/>
					<xsl:text>&#xa;</xsl:text>
				</synopsis>
			</refsynopsisdiv>
			<refsect1>
				<title>May be included in:</title>
				<para>
					<xsl:apply-templates select="parent::*" mode="parent"/>
				</para>
			</refsect1>
			<xsl:apply-templates select="$meta//refentry[@id=$id]/compact" mode="meta"/>
			<xsl:apply-templates select="$meta//refentry[@id=$id]/description" mode="meta"/>
			<xsl:apply-templates select="$meta//refentry[@id=$id]/restrictions" mode="meta"/>
			<xsl:apply-templates select="$meta//refentry[@id=$id]/example" mode="meta"/>
			<refsect1>
				<title>Attributes:</title>
				<variablelist>
					<xsl:apply-templates mode="attribute">
						<xsl:with-param name="id" select="$id"/>
					</xsl:apply-templates>
				</variablelist>
			</refsect1>
		</refentry>
	</xsl:template>
	
	<xsl:template match="rng:ref">
		<xsl:param name="indent"/>
		<xsl:apply-templates select="//rng:define[@name=current()/@name]">
			<xsl:with-param name="indent" select="$indent"/>
		</xsl:apply-templates>
	</xsl:template>
	
	<xsl:template match="rng:define">
		<xsl:param name="indent"/>
		<xsl:call-template name="combine">
			<xsl:with-param name="indent" select="$indent"/>
			<xsl:with-param name="connector" select="','"/>
		</xsl:call-template>
	</xsl:template>
	
	<xsl:template name="get-prefix">rng</xsl:template>
	
	<xsl:template match="rng:element">
		<xsl:param name="indent" select="0"/>
		<xsl:choose>
			<xsl:when test="$indent = 0">
				<xsl:apply-imports/>
			</xsl:when>
			<xsl:otherwise>
				<xsl:variable name="head">
					<xsl:value-of select="local-name (.)"/>
					<xsl:text> </xsl:text>
					<xsl:call-template name="name-class">
						<xsl:with-param name="is-attr" select="boolean (self::rng:attribute)"/>
					</xsl:call-template>
				</xsl:variable>
				<xsl:call-template name="indented">
					<xsl:with-param name="text">
						<xsl:value-of select="$head"/>
						<xsl:text> { ... }</xsl:text>
					</xsl:with-param>
					<xsl:with-param name="indent" select="$indent"/>
				</xsl:call-template>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
	
	<xsl:template match="rng:*" mode="parent">
		<xsl:apply-templates select="parent::*" mode="parent"/>
	</xsl:template>
	
	<xsl:template match="rng:define" mode="parent">
		<xsl:apply-templates select="//rng:ref[@name=current()/@name]" mode="parent"/>
	</xsl:template>
	<xsl:template match="rng:element" mode="parent">
		<literal>
			<xsl:value-of select="@name"/>
		</literal>
		<xsl:text>, </xsl:text>
	</xsl:template>
	
	<xsl:template match="rng:element" mode="attribute"/>
	
	<xsl:template match="rng:attribute[not(@name)]" mode="attribute"/>
	
	<xsl:template match="rng:*" mode="attribute">
		<xsl:param name="id"/>
		<xsl:apply-templates select="*" mode="attribute">
			<xsl:with-param name="id" select="$id"/>
		</xsl:apply-templates>
	</xsl:template>
	
	<xsl:template match="rng:ref" mode="attribute">
		<xsl:param name="id"/>
		<xsl:apply-templates select="//rng:define[@name=current()/@name]" mode="attribute">
			<xsl:with-param name="id" select="$id"/>
		</xsl:apply-templates>
	</xsl:template>
	
	<xsl:template match="rng:attribute" mode="attribute" name="attribute">
		<xsl:param name="id"/>
		<varlistentry>
			<term>
				<literal>
					<xsl:value-of select="@name"/>
				</literal>
			</term>
			<xsl:apply-templates select="$meta//refentry[@id=$id]/attributes/varlistentry[term/literal=current()/@name]/listitem" mode="meta"/>
		</varlistentry>
	</xsl:template>

	<xsl:template match="purpose" mode="meta">
		<refpurpose>
			<xsl:apply-templates mode="meta"/>
		</refpurpose>
	</xsl:template>
	
	<xsl:template match="example" mode="meta">
		<refsect1>
			<title>Example:</title>
			<programlisting>
				<xsl:apply-templates mode="meta"/>
			</programlisting>
		</refsect1>
	</xsl:template>
	
	<xsl:template match="restrictions" mode="meta">
		<refsect1>
			<title>Restrictions:</title>
			<xsl:choose>
				<xsl:when test="para">
					<xsl:apply-templates mode="meta"/>
				</xsl:when>
				<xsl:otherwise>
					<para>
						<xsl:apply-templates mode="meta"/>
					</para>
				</xsl:otherwise>
			</xsl:choose>
		</refsect1>
	</xsl:template>
	
	<xsl:template match="description" mode="meta">
		<refsect1>
			<title>Description:</title>
			<xsl:choose>
				<xsl:when test="para">
					<xsl:apply-templates mode="meta"/>
				</xsl:when>
				<xsl:otherwise>
					<para>
						<xsl:apply-templates mode="meta"/>
					</para>
				</xsl:otherwise>
			</xsl:choose>
		</refsect1>
	</xsl:template>
	
	<xsl:template match="compact" mode="meta">
		<refsect1>
			<title>Compact syntax equivalent:</title>
			<para>
				<xsl:apply-templates mode="meta"/>
			</para>
		</refsect1>
	</xsl:template>
	
	<xsl:template match="*|@*" mode="meta">
		<xsl:copy>
			<xsl:apply-templates select="@*" mode="meta"/>
			<xsl:apply-templates mode="meta"/>
		</xsl:copy>
	</xsl:template>
	
	<xsl:template match="this|thisElement|thisParent" mode="meta">
		<literal><xsl:value-of select="ancestor::refentry/name"/></literal>
	</xsl:template>

	<xsl:template match="thisName" mode="meta">
		<literal><xsl:value-of select="ancestor::refentry/name"/></literal>
	</xsl:template>
	
	<xsl:template match="varlistentry//this" mode="meta">
		<xsl:copy-of select="ancestor::varlistentry/term/literal"/>
	</xsl:template>
	
</xsl:stylesheet>
